﻿using System;
using System.Collections.Generic;
using System.Text;
using ShootSearch.Core;

namespace ShootSearch.FileSystem
{
    public interface IFileSystem: IDisposable, IConfigable
    {
        /// <summary>
        /// 文件的默认编码
        /// </summary>
        Encoding Encode{get;set;}

        /// <summary>
        /// 只写模式,对于STFileSystem可以节约内存,当启用此模式时,
        /// ID标识符可能不唯一,由此可能带来一些错误!!!
        /// 导致ID一样的后进入的文件永久无法被读取!!!
        /// </summary>
        bool WriteOnly { get;set;}

        /// <summary>
        /// 获取或者设置当前的文件系统标识符
        /// </summary>
        string FSID { get; set; }

        /// <summary>
        /// 当前文件系统标识符对应的文件大小
        /// </summary>
        long Length{get;}

        /// <summary>
        /// 文件系统的读取事件
        /// </summary>
        event FileSystemActionEventHandler FileSystemRead;
        /// <summary>
        /// 文件系统的写入事件
        /// </summary>
        event FileSystemActionEventHandler FileSystemWrite;

        /// <summary>
        /// 创造一个文件系统
        /// </summary>
        /// <param name="iopath">物理路径</param>
        ///// <param name="append">是否是追加模式</param>
        /// <returns>true 创建成功 false 失败</returns>
        bool CreateOpen(string iopath);
        /// <summary>
        /// 根据路径Path读取一个文件
        /// </summary>
        /// <param name"id">文件的标识符可以是物理的路径,或者是一个Url</param>
        /// <returns>文件流</returns>
        byte[] Read(string id);
        /// <summary>
        /// 读取文本
        /// </summary>
        /// <param name"id">文件的标识符可以是物理的路径,或者是一个Url</param>
        /// <returns>string 文件内容</returns>
        string ReadText(string id);

        /// <summary>
        /// 以流的方式写入文件
        /// </summary>
        /// <param name"id">文件的标识符可以是物理的路径,或者是一个Url</param>
        /// <param name="fileName">文件名</param>
        /// <param name="b">文件内容</param>
        /// <returns>true 写入成功 false 失败</returns>
        bool Write(string id, string fileName, byte[] b);

        /// <summary>
        /// 以流的方式写入文件
        /// </summary>
        /// <param name"id">文件的标识符可以是物理的路径,或者是一个Url,默认文件名为文件ID</param>
        /// <param name="b">文件内容</param>
        /// <returns>true 写入成功 false 失败</returns>
        bool Write(string id, byte[] b);

        /// <summary>
        /// 写入文本文件
        /// </summary>
        /// <param name"id">文件的标识符可以是物理的路径,或者是一个Url,默认文件名为文件ID</param>
        /// <param name="fileName">文件名</param>
        /// <param name="text">文件内容</param>
        /// <returns>true 写入成功 false 失败</returns>
        bool WriteText(string id, string fileName, string text);

        /// <summary>
        /// 写入文本文件
        /// </summary>
        /// <param name"id">文件的标识符可以是物理的路径,或者是一个Url,默认文件名为文件ID</param>
        /// <param name="text">文件内容</param>
        /// <returns>true 写入成功 false 失败</returns>
        bool WriteText(string id, string text);


        /// <summary>
        /// 删除一个文件
        /// </summary>
        /// <param name="id">文件的标识符可以是物理的路径,或者是一个Url</param>
        void Delete(string id);

        /// <summary>
        /// 列出当前所有的文件系统ID
        /// </summary>
        /// <returns></returns>
        List<string> ListAllFSIDs();
        /// <summary>
        /// 列出所有的文件名
        /// </summary>
        /// <returns></returns>
        List<string> ListFileNames();

        /// <summary>
        /// 关闭文件
        /// </summary>
        void Close();
        /// <summary>
        /// 将缓存写入
        /// </summary>
        void Flush();
    }
}
